/*
 * Copyright (c) 2024-2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "core/components_ng/base/frame_node.h"
#include "core/components_ng/pattern/navigation/navigation_model_static.h"
#include "core/interfaces/native/utility/callback_helper.h"
#include "core/interfaces/native/utility/converter.h"
#include "core/interfaces/native/utility/reverse_converter.h"
#include "arkoala_api_generated.h"

namespace OHOS::Ace::NG::GeneratedModifier {
namespace NavigationOpsAccessor {
constexpr int32_t DEFAULT_NAV_BAR_WIDTH = 240;
Ark_NativePointer RegisterNavBarWidthCallbackImpl(Ark_NativePointer node,
                                                  const Ark_Length* value,
                                                  const NavBarWidthCallback* callback)
{
    auto frameNode = reinterpret_cast<FrameNode *>(node);
    CHECK_NULL_RETURN(frameNode, nullptr);
    CHECK_NULL_RETURN(value, nullptr);
    auto width = Converter::OptConvert<Dimension>(*value);
    if (width.has_value() && width->IsNegative()) {
        width->SetValue(DEFAULT_NAV_BAR_WIDTH);
    }
    NavigationModelStatic::SetNavBarWidth(frameNode, width.value_or(Dimension(DEFAULT_NAV_BAR_WIDTH)));
    WeakPtr<FrameNode> weakNode = AceType::WeakClaim(frameNode);
    auto changeEvent = [arkCallback = CallbackHelper(*callback), weakNode](Dimension navBarWidth) {
        PipelineContext::SetCallBackNode(weakNode);
        arkCallback.Invoke(Converter::ArkValue<Ark_Length>(navBarWidth));
    };
    NavigationModelStatic::SetOnNavBarWidthChangeEvent(frameNode, std::move(changeEvent));
    return node;
}
} // NavigationOpsAccessor
const GENERATED_ArkUINavigationOpsAccessor* GetNavigationOpsAccessor()
{
    static const GENERATED_ArkUINavigationOpsAccessor NavigationOpsAccessorImpl {
        NavigationOpsAccessor::RegisterNavBarWidthCallbackImpl,
    };
    return &NavigationOpsAccessorImpl;
}

}
